/**
 * 
 */
package com.jiang.servlet;

import java.text.SimpleDateFormat;
import java.util.Map;

import javax.servlet.annotation.WebServlet;

import com.jiang.factory.CreateAutoBeanFactory;
import com.jiang.factory.ServiceFactory;
import com.jiang.service.front.IAdminServiceFront;
import com.jiang.service.front.impl.AdminServiceFrontImpl;
import com.jiang.utils.MD5CodeUtils;
import com.jiang.utils.ValidationUtils;
import com.jiang.vo.Admin;

/**
 * @author Administrator
 * @注意这个页面不需要过滤器拦截，所以命名独特点，为了使得过滤器统一所以Servlet命名和实际页面存放地址一致
 */
@WebServlet(name="adminServletFront", urlPatterns="/adminLoginServlet/*")
public class AdminServletFront extends DispatcherServlet {

	private static final long serialVersionUID = -2867238221184664362L;
	@SuppressWarnings("unused")
	private Admin vo;  // 定义自动装配的Bean
	
	/**
	 * @验证码的验证
	 * @return
	 */
	private boolean checkCode(){
		String code = super.getRequest().getParameter("code");
		String sessionCode = super.getSession().getAttribute("rand").toString();
		if(ValidationUtils.validateEmpty(sessionCode) && sessionCode.equalsIgnoreCase(code)){
			return true;
		}
		return false;
	}
	
	
	/**
	 * @管理员登出操作
	 * @return
	 * @throws Exception
	 */
	public String logout() throws Exception{
		
		// 登出操作记得清空Session就可以了
		super.getSession().invalidate();
		super.setUrlAndMessage("login.page", "admin.logout.success");
		return "forward.page";
	}
	
	
	/**
	 * @DispathcerServlet是做业务无关的Servlet是通用的, 这里是业务相关的
	 * @用户登录方法
	 * @return
	 */
	public String login() throws Exception{
		
		// 前面经过了自动参数验证和自动实体的装配后, 进行登录
		// 异常处理都会在父类统一处理，这里就不要再异常处理了，交给父类统一处理
		// 报错就回到系统错误页面，其他的输入有误要回到相应的页面
		if (this.checkCode()) {
			// 自动封装后，调用工厂获取
			Admin admin = CreateAutoBeanFactory.getBean(Admin.class);
			// 对已经自动装配好的Bean进行密码加密处理(MD5) 异常都会自动往上抛
			admin.setPassword(new MD5CodeUtils().getMD5ofStr(admin.getPassword()));
			// 调用业务层，业务层会使用动态代理完成异常捕获，事务处理，关闭连接
			IAdminServiceFront adminServiceFront = ServiceFactory.getInstance(AdminServiceFrontImpl.class);
			try {
				// 获取当前登录的IP地址
				String ip =  getRequest().getRemoteAddr();
				Map<String,Object> result = adminServiceFront.login(admin.getAid(), admin.getPassword(),ip);
				if((boolean) result.get("result")){
					// 这时候要根据tpye判断下到底是跳到前端还是后台
					Admin admin_data = (Admin) result.get("data");
					// 另外登录成功后，区分前后台，放置的session中的内容不一样的 ${fadmin.aid} ${badmin.lastdate}
					if(admin_data.getType() == 0){
						// 设置前台
						getSession().setAttribute("fadmin", admin_data);
						getSession().setAttribute("fadmin.lastdate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(admin_data.getLastdate()));
						getSession().setAttribute("fadmin.ip", ip);
						super.setUrlAndMessage("front.admin.index", "admin.login.success");
					}else{
						// 设置后台
						getSession().setAttribute("badmin", admin_data);
						getSession().setAttribute("badmin.lastdate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(admin_data.getLastdate()));
						getSession().setAttribute("badmin.ip", ip);
						super.setUrlAndMessage("back.admin.index", "admin.login.success");
					}
				}else{
					super.setUrlAndMessage("login.page", "admin.login.failure");
				}
			} catch (Exception e) {
				throw e;
			}
		}else{
			// 验证码有误
			super.setUrlAndMessage("login.page", "admin.coder.failure");
		}
		return "forward.page";
	}
	
	/**
	 * @修改密码
	 * @return
	 */
	public String updatePassword() throws Exception{
		
		
		String oldPassword = super.getRequest().getParameter("oldpass");
		String newPassword = super.getRequest().getParameter("newpass");
		Admin admin = (Admin) getSession().getAttribute("admin");
		String aid = admin.getAid();
		if(ValidationUtils.validateEmpty(oldPassword) && ValidationUtils.validateEmpty(newPassword)){
			IAdminServiceFront adminServiceFront = ServiceFactory.getInstance(AdminServiceFrontImpl.class);
			// 记得要md5加密处理密码
			oldPassword = new MD5CodeUtils().getMD5ofStr(oldPassword);
			newPassword = new MD5CodeUtils().getMD5ofStr(newPassword);
			boolean result = adminServiceFront.updatePassword(aid, oldPassword, newPassword);
			if(result){
				// 更新成功
				super.setUrlAndMessage("front.admin.index", "admin.updatepwss.success");
			}else{
				// 更新失败
				super.setUrlAndMessage("front.admin.index", "admin.updatepwss.failure");
			}
		}else{
			// 数据数据为空了
			super.setUrlAndMessage("front.admin.index", "validation.empty.msg");
		}
		
		return "forward.page";
	}
	
	@Override
	public String getTitle() {
		return "管理员";
	}

	@Override
	public String getAllColumn() {
		return null;
	}

	@Override
	public String getDefaultColumn() {
		return null;
	}

	@Override
	public String getUploadDir() {
		return null;
	}

}
